/**
 * 数据类型
 */

// 1.字符串 string
let name:string = 'tom';
let sex:string = "male";
let msg:string = `姓名：${name},性别：${sex}`;
// console.log(msg);

// 2.数值 number
let age = 20;
let height = 180.5;

//3.布尔 boolean
let flag:boolean = true;

//4.数组 Array
// 方式一：在数据类型的后面加[]，下面表示是一个字符串数组
let names:string[] = ['tom','jack','alice'];
names[0] = "汤姆";
// names[0] = 18; //数组中元素类型必须相同

// 方式二：使用数组泛型，Array<数据类型>
let nums:Array<number> = [12,4,1,54];

// 5.null和undefined
// let address:undefined = undefined;
// let address:null = null;  //无意义，一般不会这样做

// 默认情况下 null和undefind是所有类型的子类型，可以将null和undefined赋值给其他类型
let address:string = null; //注意：需要在配置文件中关闭严格数据类型检查
let num:number = undefined;

// 6.元组，实际上就是特殊的数组
// names[names.length] = "make";
// console.log(names);

// 定义元组的方式，只能有三个类型，分别是字符串，数值，布尔值，经过编译后就是普通数组
let tuple:[string,number,boolean] = ["xiaoming",20,false]; //元组的类型和数量都是固定的，但是各元素的类型可以不同

// tuple[0] = '李一鸣';
// tuple[0] = 18;  //不可以改变非元组规定外的类型，继续添加元素也是不被允许的
// console.log(tuple);

// 7.枚举 enum 用来限制可取值的范围，名称更友好，且有提示
enum Season {
    spring = '春', //每个成员由两部分组成：键 = 值
    summer = "夏",
    autumn = "秋",
    winter = "冬"
}
//使用时直接使用enum定义好的  枚举名.枚举键  经过编译后是个自执行函数
let s = Season.spring; 

// 8.任意类型 any 当暂时不确定变量类型时可以使用
let a:any;
a = "hello";
a = 12;
a = false;

let b:any[] = ["hello",12,false];  //数组中元素为任意类型
b[0] = 1;

// 9.空类型 void 常用于函数（表示没有返回值），表示为null或undefined
// let c:void = null;  //一般不声明变量，无意义
// 通常当函数没有返回值时，我们声明返回值类型为void
function show():void {
    console.log(111);
}

// 10.永不存在的类型 never 是任何类型的子类型，没有类型是never的子类型，any也不可以赋值never
function test():never{  //函数永远没有终点
    while(true){

    }
}

// 11.object 非原始类型，也就是除number string boolean symbol null undefined之外的类型
let d:object;
d = [18,24,43];
d = {
    name:"xiaoming",
    age:18,
    sex:"男"
};
d = new Array();
// 也就是说可以赋值为数组、对象、new xxx类型

// 12.联合类型：可以指定多个类型，只要值在规定类型中就可以赋值
let stu:number|object|string;
stu = 18;
stu = [18,24,"hello"];
stu = "你好世界";

// 13.类型断言：为类型下定一个断言，使编译通过，只在编译环境起作用
// 两种写法：1. <类型>值   2.值 as 类型
let strs:string|number;
strs = "XiaoMing";
// console.log(strs.length);   //此时我们无法使用length属性，因为我们知道他是string，但编译器不知道

// 写法一：
console.log((<string>strs).length);
// 写法二：
console.log((strs as string).length);
export{}